//
// Created by 颖滴哦 on 2023/3/15.
//
/*
 * 1.查看user/ls.c以了解如何读取目录。
 * 2.使用递归允许查找下降到子目录。
 * 3.不要重复使用“.”和“..”。
 * 4.对文件系统的更改在qemu运行期间持续存在；要获得干净的文件系统，请运行make clean，然后运行qemu。
 * 5.您需要使用C字符串。看看K&R（C书），例如第5.5节。
 * 6.注意==不像Python那样比较字符串。请改用strcmp（）。
 */
#include "kernel/types.h"
#include "user/user.h"
#include "kernel/stat.h"
#include "kernel/fs.h"

void find(char *directory, char *file) {
//    printf("find...\n");
    char buf[512], *p;
    struct dirent dirent;
    struct stat sta;
    int fd_dir;

    if ((fd_dir = open(directory, 0)) < 0) {
        fprintf(2, "find: cannot open %s\n", directory);
        return;
    }
    strcpy(buf, directory);
    p = buf + strlen(buf);
    *p++ = '/';//"buf="路径+/""
    while (read(fd_dir, &dirent, sizeof dirent) == sizeof dirent) {
        if (dirent.inum == 0) continue;
        memmove(p, dirent.name, DIRSIZ);
        p[DIRSIZ] = 0;
        stat(buf, &sta);
        switch (sta.type) {
            case T_FILE:
                if (strcmp(file, dirent.name) == 0)
                {
                    printf("%s\n",buf);
                }
                break;
            case T_DIR:
                if(strcmp(dirent.name,".")!=0&&strcmp(dirent.name,"..")!=0){
//                    printf("这是一个目录+%s\n",dirent.name);
                    find(buf,file);
                }
                break;
        }
    }
}

int
main(int argc, char *argv[]) {
    if (argc != 3) {
        printf("两个参数，find 目录名 文件名\n");
        exit(-1);
    }
    find(argv[1], argv[2]);
    exit(0);
}